home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #2 / Amiga Plus CD - 1995 - No. 2.iso / startrek / trek73 / src / parseopts.c < prev    next >
C/C++ Source or Header  |  1995-04-11  |  3KB  |  146 lines

  1. /*
  2.  * TREK73: parse_opt.c
  3.  *
  4.  * Parse the environment variable TREK73OPTS
  5.  *
  6.  * parse_opts
  7.  */
  8.  
  9. #include <ctype.h>
  10. #include "structs.h"
  11. #include "options.h"
  12.  
  13. #define    EQSTR(a, b, c)    (strncmp(a, b, c) == 0)
  14.  
  15. #define    NUM_OPTS    (sizeof optlist / sizeof (OPTION))
  16.  
  17. /*
  18.  * description of an option and what to do with it
  19.  */
  20. struct optstruct {
  21.     char    *o_name;    /* option name */
  22.     int        *o_opt;        /* pointer to thing to set */
  23.     int        o_type;        /* Boolean or string */
  24. };
  25.  
  26. typedef struct optstruct    OPTION;
  27.  
  28. extern    int terse;
  29. extern    char captain[];
  30. extern    char sex[];
  31. extern    char shipbuf[];
  32. extern    char science[];
  33. extern    char engineer[];
  34. extern    char com[];
  35. extern    char nav[];
  36. extern    char helmsman[];
  37. extern    char shipname[];
  38. extern  char foename[];
  39. extern  char racename[];
  40. extern    int silly;
  41.  
  42.  
  43. OPTION    optlist[] = {
  44.     {"terse",     (int *)&terse, BOOLEAN},
  45.     {"name", (int *)captain, STRING},
  46.     {"sex", (int *)sex, STRING},
  47.     {"ships", (int *)shipbuf, STRING},
  48.     {"science", (int *)science, STRING},
  49.     {"engineer", (int *)engineer, STRING},
  50.     {"com", (int *)com, STRING},
  51.     {"nav", (int *)nav, STRING},
  52.     {"helmsman", (int *)helmsman, STRING},
  53.     {"shipname", (int *)shipname, STRING},
  54.     {"enemy", (int *)racename, STRING},
  55.     {"foename", (int *)foename, STRING},
  56.     {"silly", (int *)&silly, BOOLEAN},
  57. };
  58.  
  59. /*
  60.  * parse_opts:
  61.  *    Parse options from string, usually taken from the environment.
  62.  *    The string is a series of comma seperated values, with booleans
  63.  *    being stated as "name" (true) or "noname" (false), and strings
  64.  *    being "name=....", with the string being defined up to a comma
  65.  *    or the end of the entire option string.
  66.  */
  67. parse_opts(str)
  68. register char *str;
  69. {
  70.     register char *sp;
  71.     register OPTION *op;
  72.     register int len;
  73.  
  74.     while (*str)
  75.     {
  76.     /*
  77.      * Get option name
  78.      */
  79.     for (sp = str; isalpha(*sp); sp++)
  80.         continue;
  81.     len = sp - str;
  82.     /*
  83.      * Look it up and deal with it
  84.      */
  85.     for (op = optlist; op < &optlist[NUM_OPTS]; op++)
  86.         if (EQSTR(str, op->o_name, len))
  87.         {
  88.         if (op->o_type == BOOLEAN)    /* if option is a boolean */
  89.             *op->o_opt = 1;
  90.         else                /* string option */
  91.         {
  92.             register char *start;
  93.             /*
  94.              * Skip to start of string value
  95.              */
  96.             for (str = sp + 1; *str == '='; str++)
  97.             continue;
  98.             start = (char *) op->o_opt;
  99.             /*
  100.              * Skip to end of string value
  101.              */
  102.             for (sp = str + 1; *sp && *sp != ','; sp++)
  103.             continue;
  104.             strucpy(start, str, sp - str);
  105.         }
  106.         break;
  107.         }
  108.         /*
  109.          * check for "noname" for booleans
  110.          */
  111.         else if (op->o_type == BOOLEAN
  112.           && EQSTR(str, "no", 2) && EQSTR(str + 2, op->o_name, len - 2))
  113.         {
  114.         *op->o_opt = 0;
  115.         break;
  116.         }
  117.  
  118.     /*
  119.      * skip to start of next option name
  120.      */
  121.     while (*sp && !isalpha(*sp))
  122.         sp++;
  123.     str = sp;
  124.     }
  125. }
  126.  
  127. /*
  128.  * strucpy:
  129.  *    Copy string using unctrl for things
  130.  */
  131. strucpy(s1, s2, len)
  132. register char *s1, *s2;
  133. register int len;
  134. {
  135.     if (len > 100)
  136.     len = 100;
  137.     while (len--)
  138.     {
  139.     if (isprint(*s2) || *s2 == ' ')
  140.         *s1++ = *s2;
  141.     s2++;
  142.     }
  143.     *s1 = '\0';
  144. }
  145.  
  146.